from . import passport_blue
from info.utils.captcha.captcha import captcha
from flask import make_response,request,jsonify,session
from info import rs,constants,db
import re
import random
from info.utils.yuntongxun.sms import CCP
from info.response_code import RET,error_map
from info.models import User
from datetime import datetime

# 功能: 用户退出
@passport_blue.route('/logout',methods=["DELETE"])
def logout():
   # 1,清除session信息
   session.pop("user_id")
   session.pop("is_admin","")

   # 2,返回响应
   return jsonify(errno=RET.OK,errmsg=error_map[RET.OK])

# 功能: 用户登录
@passport_blue.route('/login',methods=["POST"])
def login():
   # 1, 获取请求参数
   mobile = request.json.get("mobile")
   password = request.json.get("password")

   # 2, 为空校验
   if not all([mobile,password]):
      return jsonify(errno=RET.PARAMERR,errmsg=error_map[RET.PARAMERR])

   # 3, 校验用户名密码
   user = User.query.filter(User.mobile == mobile).first()
   print(user)
   if not user:
      return jsonify(errno=RET.NODATA, errmsg=error_map[RET.NODATA])

   if not user.check_password(password):
      return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])

   # 4, 登录状态保持
   session["user_id"] = user.id

   # 5,记录用户登录的时间
   user.last_login = datetime.now()
   db.session.commit()

   # 5, 返回响应
   return jsonify(errno=RET.OK,errmsg=error_map[RET.OK])

# 功能: 用户注册
@passport_blue.route('/register',methods=["POST"])
def register():
   # 1, 获取请求参数
   dict_data = request.json
   mobile = dict_data.get("mobile")
   sms_code = dict_data.get("sms_code")
   password = dict_data.get("password")

   # 2,参数校验,为空校验
   if not all([mobile,sms_code,password]):
      return jsonify(errno=RET.PARAMERR,errmsg=error_map[RET.PARAMERR])

   # 3,短信验证码校验
   # 3,1 取出redis中的短信
   rs_sms_code = rs.get(f"sms_code:{mobile}")
   # 3,2 判断redis中的短信是否过期
   if not rs_sms_code:
      return jsonify(errno=RET.NODATA,errmsg=error_map[RET.NODATA])
   # 3,3 正确性校验
   if rs_sms_code != sms_code:
      return jsonify(errno=RET.PARAMERR,errmsg=error_map[RET.PARAMERR])

   # 4,创建用户(入库)
   user =  User()
   user.nick_name = mobile
   # user.password_hash = password
   # user.password_hash = generate_password_hash(value) # 密码加密存储
   user.password = password # 密码加密存储, 和上面一句话作用一样
   user.mobile = mobile
   user.signature = "这个哥们很懒,什么都没有写~"
   db.session.add(user)
   db.session.commit()

   # 5,返回响应
   return jsonify(errno=RET.OK,errmsg=error_map[RET.OK])

# 功能: 获取短信验证码
@passport_blue.route('/sms_code',methods=["POST"])
def sms_code():
   # 1, 获取请求的数据
   dict_data = request.json
   mobile = dict_data.get("mobile")
   image_code = dict_data.get("image_code")
   image_code_id = dict_data.get("image_code_id")

   # 2, 参数为空校验
   if not all([mobile,image_code,image_code_id]):
      return jsonify(errno=RET.PARAMERR,errmsg=error_map[RET.PARAMERR])

   # 3, 校验手机号格式
   if not re.match("1[3-9]\d{9}",mobile):
      return jsonify(errno=RET.PARAMERR,errmsg=error_map[RET.PARAMERR])

   # 4,校验图片验证码
   rs_image_code = rs.get(f"image_code:{image_code_id}")

   # 5,判断验证码是否已经过期
   if not rs_image_code:
      return jsonify(errno=RET.NODATA,errmsg=error_map[RET.NODATA])

   # 6,判断用户填写的验证码, 和redis存储的图片验证码是否正确
   if rs_image_code.upper() != image_code.upper():
      return jsonify(errno=RET.DATAERR,errmsg=error_map[RET.DATAERR])

   # 6,2 图片校验完成之后,从redis中删除
   rs.delete(f"image_code:{image_code_id}")

   # 7,生成短信验证码
   sms_code = "%06d"%random.randint(0,999999)
   print(f"sms_code = {sms_code}")
   # 8,发送短信验证码
   # ccp = CCP()
   # result = ccp.send_template_sms(mobile, [sms_code, 5], 1)
   # if result == -1:
   #    return jsonify(errno="50000",errmsg="短信发送失败")

   # 8,2 储存短信到redis中,便于注册的时候进行校验
   rs.setex(f"sms_code:{mobile}", constants.SMS_CODE_EXPIRES, sms_code)

   # 9,正常返回响应
   return jsonify(errno=RET.OK,errmsg=error_map[RET.OK])

# 功能: 获取图片验证码
@passport_blue.route('/image_code')
def image_code():

   # 获取请求参数
   cur_id = request.args.get("cur_id")
   pre_id = request.args.get("pre_id")

   # 生成图片验证码
   _,text,image_data = captcha.generate_captcha()

   # 存储text(图片验证码)到redis中
   rs.setex(f"image_code:{cur_id}",constants.IMAGE_CODE_EXPIRES,text)

   # 判断是否存在上一份图片验证码,如果存在则删除
   if pre_id:
      rs.delete(f"image_code:{pre_id}")

   # 生成响应体对象并返回
   response = make_response(image_data)
   response.headers["Content-Type"] = "image/png"
   return response